/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager;

import br.com.foxinline.entidades.Bci;
import br.com.foxinline.entidades.Iptu;
import br.com.foxinline.servicos.BciServico;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

/**
 *
 * @author roniere
 */
@ManagedBean
@ViewScoped
public class ManagerBci implements Serializable {

    @EJB
    BciServico bciServico;
    private List<Bci> bci;
    private List<Bci> bcifilter;

    @PostConstruct
    public void init() {

        //read();
        bci = new ArrayList<Bci>();
        bci = bciServico.findAll();
//        bci.add(bciServico.find(45420));
//      System.err.println(bciServico.sumNaoIsentos(ufmp(800)));
//        calc();
    }

    private BigDecimal ufmp(Integer qtd) {
        return getUfmp().multiply(new BigDecimal(qtd));
    }

    private BigDecimal getUfmp() {
        return new BigDecimal("2.54");
    }

    /**
     *
     * @param bairro
     */
    private BigDecimal getBairro(Bci b) {

        String bairro = b.getBairro().trim();
        if (bairro.equalsIgnoreCase("CENTRO")) {
//            return new BigDecimal("250");
            return new BigDecimal("36.58");
        } else if (bairro.equalsIgnoreCase("NOVA PARNAIBA")) {
//            return new BigDecimal("100");
            return new BigDecimal("16.26");
        } else if (bairro.equalsIgnoreCase("N. SRA. DE FATIMA") || bairro.equalsIgnoreCase("SAO FRANCISCO")
                || bairro.equalsIgnoreCase("CEARA") || bairro.equalsIgnoreCase("PINDORAMA")
                || bairro.equalsIgnoreCase("BOA ESPERANÇA")
                || bairro.equalsIgnoreCase("SAO BENEDITO")
                || bairro.equalsIgnoreCase("RODOVIARIA")
                || bairro.equalsIgnoreCase("RODOVIARIO")
                || bairro.equalsIgnoreCase("B. CAMPOS")
                || bairro.equalsIgnoreCase("DIRCEU ARCOVERDE")
                || bairro.equalsIgnoreCase("B. RODOVIARIA")) {
//            return new BigDecimal("150");
            return new BigDecimal("12.19");
        } else if (bairro.equalsIgnoreCase("SAO JOSE") || bairro.equalsIgnoreCase("SANTA LUZIA")
                || bairro.equalsIgnoreCase("PIAUI") || bairro.equalsIgnoreCase("SAO JUDAS TADEU")
                || bairro.equalsIgnoreCase("JOAO XXIII")
                || bairro.equalsIgnoreCase("CATANDUVAS")) {
//            return new BigDecimal("80");
            return new BigDecimal("8.13");
        } else if (bairro.equalsIgnoreCase("REIS VELOSO")) {
            if (b.getFatorlocalizacao().equalsIgnoreCase("18")) {
//                return new BigDecimal("150");
                return new BigDecimal("16.26");
            }
            if (b.getFatorlocalizacao().equalsIgnoreCase("24")) {
//                return new BigDecimal("250");
                return new BigDecimal("25");
            }
            if (b.getFatorlocalizacao().equalsIgnoreCase("5") || b.getFatorlocalizacao().equalsIgnoreCase("12")) {
//                return new BigDecimal("120");
                return new BigDecimal("12.19");
            }
        } else if (bairro.equalsIgnoreCase("Floriópolis e Portinho")) {
            return new BigDecimal("4.06");
        } else if (bairro.equalsIgnoreCase("Jardim America")) {
            return new BigDecimal("4.87");
        } else if (bairro.equalsIgnoreCase("ALTO SANTA MARIA")) {
            return new BigDecimal("3.25");
        } else {
            return new BigDecimal("8.13");
        }

        return null;
    }

//"SAO VICENTE DE PAULO"
//"SAO VICENTE DE PAULA"
//"SAO VICENTE"
//"SÃO JUDAS TADEU"
//"B. BEBEDOURO"
//"FREI HIGINO"
//"PARNAIBA"
//"CANTAGALO"
//"IGARACU"
//"SÃO BENEDITO"
//"B. DE FATIMA"
//"B. CAMPOS"
//"ROSAPOLIS"
//"B. ROSAPOLIS"
//"BELAMINA"
//"J ESPERANCA"
//"SABIAZAL"
//"BAIRRO SABIAZAL"
//"DR.JOÃO TAVERES  SILVA"
//"N. SRA. DO CARMO"
    private void calc() {
        BigDecimal resul = BigDecimal.ZERO;
        BigDecimal ign = BigDecimal.ZERO;
        BigDecimal total = BigDecimal.ZERO;
        for (Bci b : bci) {
            System.err.println("#" + b.getId());
//            if (b.getIptu() != null) {
            Iptu i = new Iptu();

            i.setCreateat(new Date());

//            BigDecimal vvt = correcaoVvt(vvt(b));

//            BigDecimal vve = correcaoVve(vve(b));

            BigDecimal vvt = vvtBairro(b);
            BigDecimal vve = vveBairro(b);

            BigDecimal vvi = vvt.add(vve);

            BigDecimal tcc = tcc(b);
            BigDecimal tcl = tcl(b);
            BigDecimal tlp = tlp(b);

            BigDecimal iptu = null;


            //IPTU CORRIGIDO

            if (b.getCodigo_da_utilizacao() != null) {
                if (b.getCodigo_da_utilizacao() == 1) {
                    i.setAliquota(new BigDecimal("1.5"));
                    iptu = vvi.multiply(new BigDecimal("0.015")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    b.setTipoinsencao(5);

                } else if (b.getCodigo_da_utilizacao() == 2 && vvi.compareTo(ufmp(800)) == -1) {
                    iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    i.setAliquota(new BigDecimal("1"));

                } else if (b.getCodigo_da_utilizacao() == 2 && vvi.compareTo(ufmp(800)) == 1 && vvi.compareTo(ufmp(8700)) == -1) {
                    i.setAliquota(new BigDecimal("1"));
                    iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    b.setTipoinsencao(1);

                } else if (b.getCodigo_da_utilizacao() == 2 && (vvi.compareTo(ufmp(8700)) == 1
                        || vvi.compareTo(ufmp(8700)) == 0)) {
                    i.setAliquota(new BigDecimal("1.5"));
                    iptu = vvi.multiply(new BigDecimal("0.015")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    b.setTipoinsencao(2);

                } else if ((b.getCodigo_da_utilizacao() == 3 || b.getCodigo_da_utilizacao() == 4 || b.getCodigo_da_utilizacao() == 5)
                        && (vvi.compareTo(ufmp(2900)) == 0 || vvi.compareTo(ufmp(2900)) == -1)) {
                    i.setAliquota(new BigDecimal("1"));
                    iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    b.setTipoinsencao(3);

                } else if ((b.getCodigo_da_utilizacao() == 3 || b.getCodigo_da_utilizacao() == 4 || b.getCodigo_da_utilizacao() == 5) && (vvi.compareTo(ufmp(2900)) == 1)) {
                    i.setAliquota(new BigDecimal("1.5"));
                    iptu = vvi.multiply(new BigDecimal("0.015")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                    b.setTipoinsencao(4);
                } else {
                    System.err.println("SEM CÁLCULO: " + b.getId());
                }
            } else {
                iptu = vvi.multiply(new BigDecimal("0.01")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
                i.setAliquota(new BigDecimal("1"));
            }

            if (iptu != null) {
                BigDecimal valor = (iptu.add(tcc).add(tcl).add(tlp));
                i.setValorBase(valor);

                valor = valor.multiply(getUfmp()).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);

                resul = resul.add(valor);
                if (b.getNome().contains("IGN")) {
                    ign = ign.add(valor);
                }

                i.setValorBaseCorrigido(valor);

            }

            i.setVvt(vvt);
            i.setVve(vve);
            i.setVvi(vvi);
            i.setIptu(iptu);
            i.setTcc(tcc);
            i.setTcl(tcl);
            i.setTlp(tlp);

            b.setIptuAntigo(i);
//            b.setIptuSemCorrecao(i);
            bciServico.update(b);
        }
//        }

        System.err.println("IPTU PMP:" + resul);
        System.err.println("IPTU IGN:" + ign);
        System.err.println("IPTU TOTAL:" + total);
    }

    public List<Bci> getBcifilter() {
        return bcifilter;
    }

    public void setBcifilter(List<Bci> bcifilter) {
        this.bcifilter = bcifilter;
    }

    public List<Bci> getBci() {
        return bci;
    }

    public void setBci(List<Bci> bci) {
        this.bci = bci;
    }

    public BigDecimal vm2terreno(Bci bci) {
        if (bci.getCodigo_da_ocupacao() == 3) {
            return new BigDecimal("20000");
        }
        return new BigDecimal("28000");
    }

    public BigDecimal fatorLocalizacao(Bci bci) {
        if (bci.getFatorlocalizacao() == null) {
            return new BigDecimal("0.12");
        }
        return new BigDecimal(bci.getFatorlocalizacao()).divide(new BigDecimal("100"));
    }

    public BigDecimal topografia(Bci bci) {
        switch (bci.getCodigo_da_topografia()) {
            case 1:
                return new BigDecimal("1");
            case 2:
                return new BigDecimal("0.9");
            case 3:
                return new BigDecimal("0.8");
            default:
                return new BigDecimal("1");
        }

    }

    public BigDecimal situacao(Bci bci) {
        switch (bci.getCodigo_situacao_terreno()) {
            case 1:
                return new BigDecimal("1.10");
            case 2:
                return new BigDecimal("1");
            case 3:
                return new BigDecimal("0.8");
            default:
                return new BigDecimal("1");
        }
    }

    public BigDecimal pedologia(Bci bci) {

        switch (bci.getCodigo_da_pedologia()) {
            case 1:
                return new BigDecimal("0.60");
            case 2:
                return new BigDecimal("0.70");
            case 3:
                return new BigDecimal("0.80");
            case 4:
                return new BigDecimal("1");
            case 5:
                return new BigDecimal("1.90");
            default:
                return new BigDecimal("1");
        }
    }

    public BigDecimal valorReferencia() {
        return new BigDecimal("6");
    }

    public BigDecimal indiceReferencia() {
        return (valorReferencia().divide(new BigDecimal("1.165"), 2, RoundingMode.HALF_UP));
    }

    public BigDecimal areadoterreno(Bci bci) {
        List<Bci> exist = bciServico.existeUnidade(bci);

        if (bci.getCodigo_da_utilizacao() != null && bci.getCodigo_da_utilizacao() == 1 || (exist == null || exist.isEmpty() || exist.size() == 1)) {
            return bci.getArea_do_terreno();
        } else if (bci.getArea_da_unidade().compareTo(BigDecimal.ZERO) == 1) {
            BigDecimal fi = bci.getArea_do_terreno().multiply(bci.getArea_da_unidade());

            if (bci.getArea_construida().compareTo(BigDecimal.ZERO) == 0) {
                return fi.divide(bciServico.areaconstruidaUnidades(bci), 2, RoundingMode.HALF_UP);
            } else {
                return fi.divide(bci.getArea_construida(), 2, RoundingMode.HALF_UP);
            }
        } else {
            return bci.getArea_do_terreno();
        }
    }

    public BigDecimal vvt(Bci bci) {
        BigDecimal calc = areadoterreno(bci).multiply(vm2terreno(bci)).multiply(fatorLocalizacao(bci)).multiply(topografia(bci)).multiply(situacao(bci)).multiply(pedologia(bci));
        return calc;
    }

    public BigDecimal vvtBairro(Bci bci) {
        BigDecimal calc = areadoterreno(bci).multiply(getBairro(bci)).multiply(fatorLocalizacao(bci)).multiply(topografia(bci)).multiply(situacao(bci)).multiply(pedologia(bci));
        return calc;
    }

    public BigDecimal correcaoVvt(BigDecimal bd) {
        System.err.println(bd);
        return bd.divide(new BigDecimal("5275.75"), 8, RoundingMode.HALF_UP).multiply(indiceReferencia()).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public BigDecimal correcaoVve(BigDecimal bd) {
        return (bd.divide(new BigDecimal("5275.75"), 9, RoundingMode.HALF_UP).multiply(indiceReferencia()).divide(new BigDecimal("1.0641"), 9, RoundingMode.HALF_UP)).multiply(new BigDecimal("1000")).divide(BigDecimal.ONE, 2, RoundingMode.HALF_UP);
    }

    public BigDecimal vm2edificacao(Bci bci) {
        return new BigDecimal("8");
    }

    public BigDecimal caracteristicasImovel(Bci bci) {
        int calc = 0;

        //REVESTIMENTO
        if (bci.getCod_revestimento() != null) {
            switch (bci.getCod_revestimento()) {
                case 1:
                    calc = 0;
                    break;
                case 2:
                    calc += 23;
                    break;
                case 3:
                    calc += 17;
                    break;
                case 4:
                    calc += 12;
                    break;
                case 5:
                    calc += 20;
                    break;
            }
        } else {
            calc += 0;
        }

        //PISOS
        if (bci.getCodigo_do_piso() != null) {
            switch (bci.getCodigo_do_piso()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 10;
                    break;
                case 3:
                    calc += 17;
                    break;
                case 4:
                    calc += 20;
                    break;
            }
        } else {
            calc += 0;
        }

        //FORROS
        if (bci.getCodigo_do_forro() != null) {
            switch (bci.getCodigo_do_forro()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 3;
                    break;
                case 3:
                    calc += 3;
                    break;
                case 4:
                    calc += 4;
                    break;
            }
        } else {
            calc += 0;
        }

        //COBERTURA
        if (bci.getCodigo_da_cobertura() != null) {
            switch (bci.getCodigo_da_cobertura()) {
                case 1:
                    calc += 3;
                    break;
                case 2:
                    calc += 6;
                    break;
                case 3:
                    calc += 8;
                    break;
                case 4:
                    calc += 10;
                    break;
            }
        } else {
            calc += 8;
        }

        //INSTALACOES SANITÁRIAS
        if (bci.getCodigo_inst_sanitaria() != null) {
            switch (bci.getCodigo_inst_sanitaria()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 1;
                    break;
                case 3:
                    calc += 2;
                    break;
                case 4:
                    calc += 3;
                    break;
            }
        } else {
            calc += 0;
        }

        //INSTALACOES ELETRICAS
        if (bci.getCod_inst_eletrica() != null) {
            switch (bci.getCod_inst_eletrica()) {
                case 1:
                    calc += 0;
                    break;
                case 2:
                    calc += 8;
                    break;
                case 3:
                    calc += 12;
                    break;
            }
        } else {
            calc += 0;
        }

        //CONCRETO
        if (bci.getCodigo_da_estrutura() != null) {
            switch (bci.getCodigo_da_estrutura()) {
                case 1:
                    calc += 28;
                    break;
                case 2:
                    calc += 18;
                    break;
                case 3:
                    calc += 11;
                    break;
                case 4:
                    calc += 26;
                    break;
            }
        } else {
            calc += 28;
        }

        return new BigDecimal(calc).divide(new BigDecimal("100"));

    }

    public BigDecimal conservacao(Bci bci) {
        if (bci.getCod_estado_conservacao() != null) {
            switch (bci.getCod_estado_conservacao()) {
                case 1:
                    return new BigDecimal("1");
                case 2:
                    return new BigDecimal("0.8");
                case 3:
                    return new BigDecimal("0.5");
            }
        } else {
            return new BigDecimal("1");
        }
        return new BigDecimal("0");
    }

    public BigDecimal subtipo(Bci bci) {
        if (bci.getPosicao() != null && bci.getFachada() != null) {

            if ((!bci.getPosicao().equalsIgnoreCase("sem informação") || !bci.getPosicao().isEmpty())
                    && (!bci.getFachada().equalsIgnoreCase("sem informação") || !bci.getFachada().isEmpty())) {

                if (bci.getPosicao().equals("isolada") && bci.getFachada().equals("alinhada")) {
                    return new BigDecimal("0.9");
                } else if (bci.getPosicao().equals("isolada") && bci.getFachada().equals("recuada")) {
                    System.err.println("isolada-recuada");
                    return new BigDecimal("1");
                } else if (bci.getPosicao().equals("geminada") && bci.getFachada().equals("alinhada")) {
                    return new BigDecimal("0.7");
                } else if (bci.getPosicao().equals("geminada") && bci.getFachada().equals("recuada")) {
                    return new BigDecimal("0.8");
                } else if (bci.getPosicao().equals("superposta") && bci.getFachada().equals("alinhada")) {
                    return new BigDecimal("0.8");
                } else if (bci.getPosicao().equals("superposta") && bci.getFachada().equals("recuada")) {
                    return new BigDecimal("0.9");
                } else if (bci.getPosicao().equals("conjugada") && bci.getFachada().equals("alinhada")) {
                    return new BigDecimal("0.8");
                } else if (bci.getPosicao().equals("conjugada") && bci.getFachada().equals("recuada")) {
                    return new BigDecimal("0.9");
                }

            } else {
                return new BigDecimal("1");
            }
        }
        return new BigDecimal("1");
    }

    public BigDecimal vveBairro(Bci bci) {

        if (bci.getArea_da_unidade().compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal calc = bci.getArea_da_unidade().multiply(getBairro(bci));

        calc = calc.multiply(caracteristicasImovel(bci));
        calc = calc.multiply(conservacao(bci));
        calc = calc.multiply(subtipo(bci));
        return (calc);
    }

    public BigDecimal vve(Bci bci) {

        if (bci.getArea_da_unidade().compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        BigDecimal calc = bci.getArea_da_unidade().multiply(vm2edificacao(bci));

        calc = calc.multiply(caracteristicasImovel(bci));
        calc = calc.multiply(conservacao(bci));
        calc = calc.multiply(subtipo(bci));
        return (calc);
    }

    public BigDecimal tcc(Bci bci) {
        return (indiceReferencia().multiply(bci.getTestada_do_imovel())).multiply(new BigDecimal("0.02")).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public BigDecimal tcl(Bci bci) {
        return (indiceReferencia().multiply(bci.getArea_da_unidade())).multiply(new BigDecimal("0.01")).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public BigDecimal tlp(Bci bci) {
        return (indiceReferencia().multiply(bci.getTestada_do_imovel())).multiply(new BigDecimal("0.02")).divide(new BigDecimal("1.0641"), 2, RoundingMode.HALF_UP);
    }

    public void read() throws FileNotFoundException, IOException {
        InputStreamReader reader = new InputStreamReader(new FileInputStream(new File("/opt/bd/teste2.csv")), "UTF8");

        BufferedReader read = new BufferedReader(reader);
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream("/opt/bd/teste3.csv"), "UTF8"));
        String l = null;
        int cont = 1;
        while ((l = read.readLine()) != null) {
            //l = l.replace(",000000", "");
            //l = l.replace("\"", "");
            //l = l.replace("null", "");
            writer.write(l);
            writer.newLine();
            System.err.println(cont);
            cont++;
        }
        writer.flush();
        writer.close();
        read.close();
        reader.close();

    }
}
